home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / scope / 101-125 / scopedisk122 / popup / source / inputhandler.c < prev    next >
C/C++ Source or Header  |  1995-03-19  |  3KB  |  89 lines

  1. #include "PopUpMenu.h"
  2.  
  3. #define QUALIFIERS (IEQUALIFIER_LSHIFT   | IEQUALIFIER_RSHIFT    | \
  4.             IEQUALIFIER_CONTROL  | IEQUALIFIER_LALT     | \
  5.             IEQUALIFIER_RALT     | IEQUALIFIER_LCOMMAND  | \
  6.             IEQUALIFIER_RCOMMAND | IEQUALIFIER_MIDBUTTON | \
  7.             IEQUALIFIER_LEFTBUTTON)
  8. IMPORT struct IntuitionBase *IntuitionBase;
  9.  
  10. /*++++++++++++++++++++++++++++++++++++++++++++++++
  11. +  MyHandler(Events, MySignals)
  12. +    Look for MenuDown & MenuUp events and signal our task
  13. +
  14. +  INPUTS
  15. +    Events    - List of events (from input.device)
  16. +    MySignals - PopUpMenuTask & MenuUp, MenuDown Signals
  17. +
  18. +  OUTPUT
  19. +    Eventlist without MenuDown messgaes
  20. +++++++++++++++++++++++++++++++++++++++++++++++++++*/
  21. struct InputEvent *PopUpHandler(Events, MySignals)
  22.   struct InputEvent *Events;
  23.   struct SignalData *MySignals;
  24. {
  25.  
  26.   struct InputEvent *Event;
  27.   struct InputEvent *LastEvent;
  28.  
  29.   if (MySignals->Down)
  30.     /* tell the task we are living */
  31.     Signal(MySignals->PopUpMenuTask, MySignals->MouseMovedSig);
  32.  
  33.   for (Event = Events, LastEvent = NULL; Event != NULL; Event = Event->ie_NextEvent) {
  34.     if (Event->ie_Class == IECLASS_RAWMOUSE) {
  35.       if (NOT(MySignals->Down)) {
  36.     union {
  37.       struct Window *ActiveWindow;
  38.       struct Screen *ActiveScreen;
  39.     } Temp;
  40.     /* Do not signal my task if
  41.        1) Any qualifierkey is pressed.
  42.        2) Mouse in menubar
  43.        3) No window is active.
  44.        4) A requester is blocking the window.
  45.        5) Window has no menues
  46.        6) Window has RMBTRAP set */
  47.  
  48.     if ((Event->ie_Code == MENUDOWN) AND
  49.         !(Event->ie_Qualifier & QUALIFIERS) AND
  50.         (Temp.ActiveScreen = IntuitionBase->ActiveScreen) AND
  51.         (Temp.ActiveScreen->MouseY >= Temp.ActiveScreen->BarHeight) AND
  52.         (Temp.ActiveWindow = IntuitionBase->ActiveWindow) AND
  53.         (Temp.ActiveWindow->ReqCount == 0) AND
  54.         (Temp.ActiveWindow->MenuStrip) AND
  55.         !(Temp.ActiveWindow->Flags & RMBTRAP)) {
  56.       Signal (MySignals->PopUpMenuTask, MySignals->MenuDownSig);
  57.       MySignals->Down = TRUE;
  58.     }
  59.     else
  60.       goto GetOutOfHere;  /* oops! */
  61.       } /* if NOT Down */
  62.       else  /* Down */
  63.     switch (Event->ie_Code) {
  64.       case SELECTDOWN:
  65.         Signal(MySignals->PopUpMenuTask, MySignals->SelectDownSig);
  66.       case SELECTUP:
  67.         break;
  68.       case MENUUP:
  69.         Signal (MySignals->PopUpMenuTask, MySignals->MenuUpSig);
  70.         MySignals->Down = FALSE;
  71.         break;
  72.       default:
  73.         goto GetOutOfHere;    /* oops! */
  74.     } /* case */
  75.       /* Take event from chain */
  76.       if (LastEvent == NULL)
  77.     Events = Event->ie_NextEvent;
  78.       else
  79.     LastEvent->ie_NextEvent = Event->ie_NextEvent;
  80.       continue;
  81.     } /* if RAWMOUSE */
  82.  
  83. GetOutOfHere:
  84.     LastEvent = Event;
  85.   }
  86.   return(Events);
  87. }
  88.  
  89.